package 泛型;


/**
 * Question:如何实现一个通用的顺序表：
 * 泛型：
 * 1.<T>代表当前类是一个泛型类
 * 2.new T[10]:不能new泛型类型的数组，eg:T[] t = new T[10];(wrong)
 * 3.泛型的意义：
 *      ①存储元素的时候，自动进行类型检查
 *      ②获取元素的时候，自动进行类型的转换
 * 4.泛型类型的参数：不能是简单类型
 * 5.泛型类型的参数，不参与类型的组成
 *
 *
 * 面试题：
 *  泛型是如何进行编译的？
 *      ①泛型只有编译的时候起作用！在运行时，是没有泛型的概念的！
 *      ②擦出机制 T-->Object -->不严谨（之后也会讲解擦除边界！）
 *
 *
 */

//自定义一个简单的MyArrayList顺序表
//是否能实现存放任意类型的数据？
//泛型的特点、运行机制、注意事项
class MyArrayList<T>{
    private T[] elem;
    private int usedSize;

    public MyArrayList() {
        //this.elem = new T[10];
        this.elem =(T[]) new Object[10];//强制类型转换成T[]类型的数组
    }

    public void add(T elem){
        this.elem[this.usedSize++] = elem;
    }

    public T getPos(int pos){
        return this.elem[pos];
    }
}

class Person{
    Person(){

    }
}

public class TestDemo {
    public static void main1(String[] args) {
        MyArrayList<Integer> arrayList = new MyArrayList<>();
        arrayList.add(123);
        arrayList.add(234);
        System.out.println(arrayList);
        int ret = arrayList.getPos(1);   //T类型自动转换为int类型哦
        System.out.println(ret);

        MyArrayList<String> arrayList2 = new MyArrayList<>();
        arrayList2.add("feng");
        arrayList2.add("xiao");
        System.out.println(arrayList2);




    }



    //getClass().getName()是一样的！
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person);

        MyArrayList<Integer> arrayList1 = new MyArrayList<>();
        System.out.println(arrayList1);

        MyArrayList<String> arrayList2 = new MyArrayList<>();
        System.out.println(arrayList2);
    }




}
